GitHub ActionsのワークフローへCircleCIのワークフロー流用を試してみた
はじめに
GitHub ActionsはGitHub上でワークフローが完結する点が魅力です。既にCircleCIでのワークフローを作成している状態でしたが、GitHub Actionsでの動作がどんな感じになるか確かめてみたくなりました。
手軽になんとかならないかと思い、CircleCI用に作成したYAMLを弄ってGitHub Actionsに使う方向で試してみました。
YAML参考記事
過去に書いたCircleCI関連記事と、Qiitaに上がっていたGitHub Actionsを試した記事を参考にしています。
【GitHub】新GitHub Actionsを使ってAWS ECRにイメージをプッシュするCIを作ってみた - Qiita
主な修正ポイント
YAMLを見比べると、大きな違いとしてはGitHub Actions側のuses
があります。GitHub上のリポジトリをActionとして定義して、ワークフローに用いるものです。
GitHub Actions | GitHub Developer Guide
既定のActionとして利用可能なリポジトリについては以下のリンク先から確認できます。
今回Actionを踏まえて手をいれた箇所としては以下の通りです。
- Python3のインストール
- カバレッジファイルのアップロード
Python3のインストール
CircleCI用YAMLでは手間を省く目的でPython3.7が導入済みのDockerイメージを利用していましたが、GitHub ActionsではYAMLの中でPythonの追加セットアップを行う方法があります。
CircleCI
docker: - image: circleci/python:3.7.3
GitHub Actions
actions/setup-python: Set up your GitHub Actions workflow with a specific version of python
steps: - uses: actions/checkout@master - name: Set up Python 3.7 uses: actions/setup-python@v1 with: version: '3.7' architecture: 'x64'
カバレッジのアップロード
アップロードしたファイルの扱いについては、プラットフォームごとに大きく違ってきます。CircleCIではその場で見ることができますが、GitHub Actionsの場合はダウンロードする必要があります。
codecov等の外部にアップロードするActionも存在するため、表示を最適化したい場合は併用も一つの手です。
codecov/codecov-action: GitHub Action that uploads coverage to Codecov
CircleCI
- store_artifacts: path: htmlcov destination: htmlcov
GitHub Actions
- uses: actions/upload-artifact@master with: name: coverage path: htmlcov
検証に用いたYAML
検証に用いたYAMLは以下の通りです。
CircleCI
jobs: build: docker: - image: circleci/python:3.7.3 steps: - checkout - run: sudo chown -R circleci:circleci /usr/local/bin - run: sudo chown -R circleci:circleci /usr/local/lib/python3.7/site-packages - restore_cache: # このステップは依存関係をインストールする<em>前</em>に実行します key: deps9-{{ .Branch }}-{{ checksum "Pipfile.lock" }} - run: command: | pip install pipenv pipenv sync --dev - save_cache: key: deps9-{{ .Branch }}-{{ checksum "Pipfile.lock" }} paths: - ".venv" - "/usr/local/bin" - "/usr/local/lib/python3.7/site-packages" - run: name: run tests command: | pipenv run pytest tests --cov-report=term-missing --cov-report=html - store_artifacts: path: htmlcov destination: htmlcov - run: name: run linting and metrics command: | pipenv run flake8 src/ tests/
GitHub Actions
name: CI on: [push] jobs: build: name: setup runs-on: ubuntu-18.04 steps: - uses: actions/checkout@master - name: Set up Python 3.7 uses: actions/setup-python@v1 with: version: '3.7' architecture: 'x64' - name: Install dependencies run: | pip install --upgrade pip pipenv pipenv sync --dev - name: Test and cov run: | pipenv run pytest tests --cov-report=term-missing --cov-report=html - uses: actions/upload-artifact@master with: name: coverage path: htmlcov - name: Lint run: | pipenv run flake8 src/ tests/
若干項目名に違いがありますが、個別で設定すべき項目に大きな変化はありません。
あとがき
現時点でCircleCIを使った設定がPythonの実行とソースコートのテストのシンプルなワークフローなこともあり、そこまでの大きな変更は発生しませんでした。
なお、作業用ブランチに追加したgitHub actions用設定ファイルは、default設定されているブランチに対してpull-requestすることで実施されました。追加したのにactionが動作しない等のトラブルに陥った場合の参考になれば幸いです。